package com.divemotor.ventarepuestosinternet.controller;

import java.io.Serializable;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;

import com.divemotor.ventarepuestosinternet.beans.ElementoCotizacion;
import com.divemotor.ventarepuestosinternet.beans.adapter.DataAdapter;
import com.divemotor.ventarepuestosinternet.beans.form.CarritoComprasBeanForm;
import com.divemotor.ventarepuestosinternet.exception.DivemotorBusinessException;
import com.divemotor.ventarepuestosinternet.model.Cotizacion;
import com.divemotor.ventarepuestosinternet.model.Sucursal;
import com.divemotor.ventarepuestosinternet.service.CotizacionService;
import com.divemotor.ventarepuestosinternet.service.DepartamentoService;
import com.divemotor.ventarepuestosinternet.service.ProvinciaService;
import com.divemotor.ventarepuestosinternet.service.SucursalService;
import com.divemotor.ventarepuestosinternet.util.Constantes;
import com.divemotor.ventarepuestosinternet.util.FacesContextUtil;

@ManagedBean(name = "carritoComprasController")
@ViewScoped
public class CarritoComprasController implements Serializable {
	
	private static final Logger logger = Logger.getLogger(CarritoComprasController.class);	
	
	private static final long serialVersionUID = 2279006974509860395L;

	@ManagedProperty(value = "#{departamentoService}")
	private DepartamentoService departamentoService;
	@ManagedProperty(value = "#{provinciaService}")
	private ProvinciaService provinciaService;
	@ManagedProperty(value = "#{sucursalService}")
	private SucursalService sucursalService;
	@ManagedProperty(value = "#{carritoComprasSessionController}")
	private CarritoComprasSessionController carritoComprasSessionController;
	@ManagedProperty(value = "#{cotizacionService}")
	private CotizacionService cotizacionService;
	@ManagedProperty(value = "#{cotizacionController}")
	private CotizacionController cotizacionController;
	@ManagedProperty(value = "#{historialCotizacionesController}")
	private HistorialCotizacionesController historialCotizacionesController;
	@ManagedProperty(value = "#{loginController}")
	private LoginController loginController;
	@ManagedProperty(value = "#{clienteUsuarioController}")
	private ClienteUsuarioController clienteUsuarioController;
	
	private CarritoComprasBeanForm carritoComprasBeanForm;
	private List<DataAdapter> listaDepartamentos;
	private List<DataAdapter> listaProvincias;
	private List<DataAdapter> listaSucursales;
	
	private Cotizacion cotizacion;
	private boolean seMostroConfirmacion = false;

	private ElementoCotizacion elementoCotizacionEditar;
	private ElementoCotizacion elementoCotizacionEliminar;

	public CarritoComprasController() {
		carritoComprasBeanForm      = new CarritoComprasBeanForm();
		elementoCotizacionEditar 	= new ElementoCotizacion();
		elementoCotizacionEliminar 	= new ElementoCotizacion();
	}

	@PostConstruct
	void init() {
		logger.info("PostConstruct");
		listarDepartamento();
	}

	public void editarElementoCotizacion() {
		FacesContextUtil.info(Constantes.MSJ_ACTUALIZACION_OK);
	}

	public void eliminarElementoCotizacion() {
		carritoComprasSessionController.eliminarElementoCotizacion(elementoCotizacionEliminar);
		FacesContextUtil.info(Constantes.MSJ_VEHICULO_ELIMINADO_OK);
	}

	public void listarDepartamento() {
		logger.info("listarDepartamento");
		try {
			listaDepartamentos = departamentoService.listarDepartamentoConSucursal(loginController.getPais());
		} catch (Exception e) {
			logger.error("EX* listarDepartamento: " + e.getMessage());
		}
	}

	public void listarProvincias() {
		logger.info("listarProvincias");
		try {
			listaProvincias = provinciaService.listarProvinciasConSucursal(carritoComprasBeanForm.getIdDepartamento());
		} catch (Exception e) {
			logger.error("EX* listarProvincias: " + e.getMessage());
		}
	}

	public void listarSucursales() {
		logger.info("listarSucursales");
		try {
			listaSucursales = sucursalService.listarSucursalesPorProvincia(carritoComprasBeanForm.getIdProvincia());
		} catch (Exception e) {
			logger.error("EX* listarSucursales: " + e.getMessage());
		}
	}

	public void guardarSolicitudCotizacion() {
		if(!carritoComprasSessionController.isEmpty()){
			guardarSolicitud();
			limpiarBusqueda();
		}else{
			FacesContextUtil.error(Constantes.MSJ_CARRITO_VACIO);
		}
	}

	public void guardarSolicitud() {
		try {
			cotizacion = carritoComprasSessionController.generarSolicitud();
			cotizacion.setObservacion(carritoComprasBeanForm.getObservacion());
			cotizacion.setSucursal(new Sucursal(carritoComprasBeanForm.getIdSucursal()));
			cotizacion.setCliente(clienteUsuarioController.getNombreCliente());
			cotizacionService.guardar(cotizacion);
			carritoComprasSessionController.resetearColecciones();
			historialCotizacionesController.buscarCotizaciones();
			FacesContextUtil.info(Constantes.MSJ_COTIZACION_REGISTRO_OK);
		} catch (DivemotorBusinessException e) {
			logger.error("EX* guardarSolicitud DivemotorBusinessException: " + e.getMessage());
			RequestContext.getCurrentInstance().addCallbackParam("ocurrioError", true);
			FacesContextUtil.warn(e.getMessage());
		} catch (Exception e) {
			logger.error("EX* guardarSolicitud Exception: " + e.getMessage());
			RequestContext.getCurrentInstance().addCallbackParam("ocurrioError", true);
			FacesContextUtil.error(Constantes.MSJ_ERROR_SISTEMA);
		}
	}

	public void validarCarrito() {
		RequestContext requestContext = RequestContext.getCurrentInstance();
		if (carritoComprasSessionController.isEmpty()) {
			FacesContextUtil.error(Constantes.MSJ_CARRITO_VACIO);
			requestContext.addCallbackParam("ocurrioError", true);
		}else{
			requestContext.addCallbackParam("mostrarDialog", true);
		}
	}
	
	private void limpiarBusqueda(){
		carritoComprasBeanForm.limpiarForm();
	}

	public List<DataAdapter> getListaDepartamentos() {
		return listaDepartamentos;
	}

	public void setListaDepartamentos(List<DataAdapter> listaDepartamentos) {
		this.listaDepartamentos = listaDepartamentos;
	}

	public List<DataAdapter> getListaProvincias() {
		return listaProvincias;
	}

	public void setListaProvincias(List<DataAdapter> listaProvincias) {
		this.listaProvincias = listaProvincias;
	}

	public List<DataAdapter> getListaSucursales() {
		return listaSucursales;
	}

	public void setListaSucursales(List<DataAdapter> listaSucursales) {
		this.listaSucursales = listaSucursales;
	}

	public ElementoCotizacion getElementoCotizacionEditar() {
		return elementoCotizacionEditar;
	}

	public void setElementoCotizacionEditar(ElementoCotizacion elementoCotizacionEditar) {
		this.elementoCotizacionEditar = elementoCotizacionEditar;
	}

	public ElementoCotizacion getElementoCotizacionEliminar() {
		return elementoCotizacionEliminar;
	}

	public void setElementoCotizacionEliminar(ElementoCotizacion elementoCotizacionEliminar) {
		this.elementoCotizacionEliminar = elementoCotizacionEliminar;
	}

	public void setDepartamentoService(DepartamentoService departamentoService) {
		this.departamentoService = departamentoService;
	}

	public void setProvinciaService(ProvinciaService provinciaService) {
		this.provinciaService = provinciaService;
	}

	public void setSucursalService(SucursalService sucursalService) {
		this.sucursalService = sucursalService;
	}

	public void setCotizacionService(CotizacionService cotizacionService) {
		this.cotizacionService = cotizacionService;
	}

	public void setCarritoComprasSessionController(CarritoComprasSessionController carritoComprasSessionController) {
		this.carritoComprasSessionController = carritoComprasSessionController;
	}

	public void setCotizacionController(CotizacionController cotizacionController) {
		this.cotizacionController = cotizacionController;
	}

	public void setHistorialCotizacionesController(HistorialCotizacionesController historialCotizacionesController) {
		this.historialCotizacionesController = historialCotizacionesController;
	}

	public boolean isSeMostroConfirmacion() {
		return seMostroConfirmacion;
	}

	public void setSeMostroConfirmacion(boolean seMostroConfirmacion) {
		this.seMostroConfirmacion = seMostroConfirmacion;
	}

	public void setLoginController(LoginController loginController) {
		this.loginController = loginController;
	}

	public CarritoComprasBeanForm getCarritoComprasBeanForm() {
		return carritoComprasBeanForm;
	}

	public void setCarritoComprasBeanForm(CarritoComprasBeanForm carritoComprasBeanForm) {
		this.carritoComprasBeanForm = carritoComprasBeanForm;
	}

	public void setClienteUsuarioController(ClienteUsuarioController clienteUsuarioController) {
		this.clienteUsuarioController = clienteUsuarioController;
	}
}
